package cn.xwt.weidisk.util;

import cn.xwt.weidisk.mapper.FileMapper;
import cn.xwt.weidisk.pojo.dao.FileDo;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 薛慰涛
 */
@Component
public class FileUtils {
    @Resource
    FileMapper fileMapper;

    private final String ROOT = "/";

    /**
     * 判断文件是否存在
     * @param fileDo 文件信息
     * @return boolean
     */
    public boolean exists(FileDo fileDo) {
        Long id = fileMapper.selectFileByNameAndPath(fileDo);
        return id != null;
    }

    /**
     * 修改文件路径
     * @param to 原路径
     * @param from 移动到的路径
     * @param moveList 要修改路径的文件列表
     */
    public void setMovePath(String to, String from, List<FileDo> moveList) {
        // 执行复制操作
        Pattern pattern = Pattern.compile(from);
        // 遍历要复制的文件并修改移动后的文件路径
        for (FileDo file : moveList) {
            Matcher matcher = pattern.matcher(file.getPath());
            // 将文件复制到'/'
            if (to.equals(ROOT)) {
                String toPath = matcher.replaceFirst("");
                // 如果toPath为空字符串则将其换为 ‘/’
                if ("".equals(toPath)) {
                    toPath = ROOT;
                }
                file.setPath(toPath);
                // 将文件从‘/’复制到其它文件
            } else if (from.equals(ROOT)) {
                // 文件路径为‘/’则不在添加‘/’
                if (file.getPath().equals(ROOT)) {
                    file.setPath(matcher.replaceFirst(to));
                } else {
                    file.setPath(matcher.replaceFirst(to + "/"));
                }
                // 其它目录复制到其它目录
            } else {
                file.setPath(matcher.replaceFirst(to));
            }
        }
    }


    /**
     * 判断移动后的文件是否存在
     * @param to 原路径
     * @param from 移动到的路径
     * @param folder 要移动的文件夹
     * @return boolean
     */
    public boolean existsFolderAfterMove(String to, String from, FileDo folder) {
        Pattern pattern = Pattern.compile(from);
        String originalPath = folder.getPath();
        // 遍历要复制的文件

        Matcher matcher = pattern.matcher(folder.getPath());
        // 将文件复制到'/'
        if (to.equals(ROOT)) {
            String toPath = matcher.replaceFirst("");
            // 如果toPath为空字符串则将其换为 ‘/’
            if ("".equals(toPath)) {
                toPath = ROOT;
            }
            folder.setPath(toPath);
            // 将文件从‘/’复制到其它文件
        } else if (from.equals(ROOT)) {
            // 文件路径为‘/’则不在添加‘/’
            if (folder.getPath().equals(ROOT)) {
                folder.setPath(matcher.replaceFirst(to));
            } else {
                folder.setPath(matcher.replaceFirst(to + "/"));
            }
            // 其它目录复制到其它目录
        } else {
            folder.setPath(matcher.replaceFirst(to));
        }


        if (exists(folder)) {
            folder.setPath(originalPath);
            return true;
        } else {
            folder.setPath(originalPath);
            return false;
        }
    }

    /**
     * 创建目录
     * @param path 路径
     * @param uid 用户id
     */
    public void createFolder(String path, Long uid) {
        // 为根目录是不再创建
        if (path.equals(ROOT)) {
            return;
        }

        final String emptyString = "";

        // 获取文件件信息
        FileDo folder = new FileDo();
        int index = path.lastIndexOf("/");
        String folderPath = path.substring(0, index);
        if (folderPath.equals(emptyString)) {
            folderPath = ROOT;
        }
        String folderName = path.substring(index + 1);
        folder.setUid(uid);
        folder.setName(folderName);
        folder.setPath(folderPath);
        folder.setType("folder");
        // 如果文件夹不存在就新建文件夹
        if (!exists(folder)) {
            fileMapper.insertFile(folder);
            createFolder(folderPath, uid);
        }
    }
}
